﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.Data;
using WrapperAlertas.ReferenciaCalculoDemora;
using WrapperAlertas.ReferenciaSMS;

namespace WrapperAlertas
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Program started");
            //TODO: Usar el data set de sublineas
            int[] sublineas = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            ds.Tables.Add(dt);
            dt.Columns.Add("idSublinea", typeof(int));
            foreach (int sublinea in sublineas)
            {
                DataRow dr = dt.NewRow();
                dr["idSublinea"] = sublinea;
                dt.Rows.Add(dr);
            }

            // Obtener alertas que no se han mandado hoy
            DateTime ahora = DateTime.Now;
            using (AlertasDataContext adc = new AlertasDataContext())
            {
                var alertasAux = (from a in adc.ALERTAs
                               where (!a.ALERTA_FECHA_ULTIMO_ENVIO.HasValue ||
                               a.ALERTA_FECHA_ULTIMO_ENVIO.Value.Date < ahora.Date)                               
                               select a).ToArray();

                var alertas = alertasAux.Where(a => a.ALERTA_DIAS.ToCharArray()[(int)ahora.DayOfWeek].Equals('1')).ToArray();

                ServicioCalculoDatosSoapClient cliente = new ServicioCalculoDatosSoapClient();
                // Obtengo las distintas lineas para consultar al simulador
                foreach (var alerta in alertas)
                {
                    List<double> demoras = cliente.CalcularDemora(alerta.LINEA_ID.ToString(), ds, alerta.PARADA_ID);
                    foreach (var demora in demoras)
                    {
                        int minutos = TimeSpan.FromMilliseconds(demora).Minutes;
                        if (minutos == alerta.ALERTA_MINUTOS || minutos == (alerta.ALERTA_MINUTOS - 1))
                        {
                            // Alerta para enviar
                            string celular = (from u in adc.USUARIOs
                                              where u.USUARIO_ID == alerta.USUARIO_ID
                                              select u.USUARIO_CELULAR).Single();
                            string mensaje = "El omnibus de la linea " + alerta.LINEA_ID + " esta a " + 
                                minutos.ToString() + " minutos de su parada.";
                            SMSServiceClient smsClient = new SMSServiceClient();
                            smsClient.enviarSMS(celular , mensaje);
                            alerta.ALERTA_FECHA_ULTIMO_ENVIO = DateTime.Now;
                            adc.SubmitChanges();
                            break;
                        }
                    }

                }
                Console.WriteLine("Program finished");
                // Obtener posicion actual de cada omnibus que se espera y enviar alerta si corresponde
                //foreach (var alerta in alertas)
                //{
                //    ServiceSoapClient ssc = new ServiceSoapClient();
                //    DataTable tablaLinea = ssc.devolverInformacionLinea(alerta.LINEA_ID.ToString());
                //    foreach (DataRow infoRow in tablaLinea.Rows)
                //    {
                //        // Coordenadas del bondi
                //        double x = (double)(decimal)infoRow["x"];
                //        double y = (double)(decimal)infoRow["y"];

                //    }
                //}
            }
        }
    }
}
